JS函数内部的[[scope]]属性
438 字
2 分钟
JS函数内部的[[scope]]属性
[[scope]]
函数内部的[[scope]]属性是虚拟出来的一个属性,我们实际访问时访问不到这个属性的,这个属性是为了让我们更好的理解函数,虚拟出来的一个属性。
var fun1,fun2;function foo() { var x = 10; fun1 = function () { console.log(++x);//11 x=11 }; fun2 = function () { console.log(--x);//10 x=10 }}foo(); // 初始化了fun1,fun2函数fun1(); // 11fun2(); // 10- 产生这个情况的原因是<在同一父作用域中的闭包共同同一个>在同一父作用域中的闭包共同同一个>
[[scope]]属性
var x = 10;function foo () { console.log(x);}foo(); // 10function fun () { var x = 20; var foo1 = foo; foo1(); // 10}fun();-
是10的原因就是在复制函数的时候,复制后的函数与复制前的函数引用的是同一个
[[scope]]属性,由于foo的[[scope]]属性中的x是保存在函数父作用域链中的,这个也就是指的全局的变量对象(也就是全局变量)中的x,foo1中[[scope]]属性与foo的相同,所以foo1在执行创建的scope,只有foo1内部的[[scope]]属性(也就是foo内部的[[scope]]属性),所以在查找原型链时,foo1作用域链就直接查找到了全局对象中的x属性,所以会返回10。 -
[[Scope]]和执行期上下文虽然保存的都是作用域链,但不是同一个东西 -
[[Scope]]属性是函数创建时产生的,会一直存在;而执行上下文在函数执行时产生,函数执行结束便会销毁 -
伪代码:
foo函数创建产生[[Scope]]对象
foo.[[Scope]] = { GO: { this: window , window:... , document: ... , a: undefined, //预编译阶段还不知道a的值是多少,执行过程中会修改 foo: function(){...}, ...... }}支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
JS函数内部的[[scope]]属性
https://gaodaxiu-blog.netlify.app/posts/JS函数内部的[[scope]]属性/











